﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace NtcResCalc
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Int32 NtcCalc_GetResByTemp(double _B,double _Rstd, double _TempC,double _TempStd=25)
        {
            //Rt = R EXP(B(1 / T1 - 1 / T2))
            //Rt = R *EXP(B*(1/T1-1/T2))
            double _T1 = 273.15 + _TempC;
            double _T2 = 273.15 + _TempStd;
            double Rt = _Rstd * Math.Exp(_B * (1 / _T1 - 1 / _T2));

            int R = 0;

            //使用数学函数对浮点数(3.54)进行取小数位0位.然后Convert转int类型
            R =Convert.ToInt32( Math.Round(Rt,0));


            return R;
        }


        private double NtcCalc_GetTempByRes(double _B, double _Rstd, double _Rt, double _TempStd = 25)
        {
            //T1=1/（ln（Rt/R）/B+1/T2）
            double _T2 = 273.15 + _TempStd;
            double _T1 = 1 / (Math.Log(_Rt / _Rstd) / _B + 1 / _T2);
            double _TempC = _T1- 273.15;
            return _TempC;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            double _TempC = NtcCalc_GetTempByRes(((double)numericUpDown1.Value), ((double)numericUpDown2.Value), ((double)numericUpDown3.Value), ((double)numericUpDown4.Value));
            label8.Text = _TempC.ToString() + " C";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Int32 Rt = NtcCalc_GetResByTemp(((double)numericUpDown1.Value), ((double)numericUpDown2.Value), ((double)numericUpDown5.Value), ((double)numericUpDown4.Value));
            label7.Text = Rt.ToString()+" R";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
        }


        private void SaveItemsToFile_Res_H(string filename,int startT,int endT)
        {
            double pullres = ((double)numericUpDown8.Value);
            int adcvMax =(int)numericUpDown9.Value;

            double adcv = 0;
            double resv = 0;
            int pullupOrpulldown= comboBox1.SelectedIndex;

            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Title = "导出阻值分度文件";
            //sfd.InitialDirectory = @"C:\";
            sfd.Filter = "(*.h)|*.h";
            sfd.FileName = filename;

            //c
            SaveFileDialog sfdc = new SaveFileDialog();
            sfdc.Title = "导出阻值分度文件";
            //sfd.InitialDirectory = @"C:\";
            sfdc.Filter = "(*.c)|*.c";
            sfdc.FileName = filename;


       

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                if (sfd.FileName.Length > 0)
                {
                    string path = sfd.FileName;
                    List<String> lines=new List<string>();
                    lines.Add("#ifndef __"+ filename + "_H_");
                    lines.Add("#define __" + filename + "_H_");
                    lines.Add("");
                    lines.Add("//各温度ADC值 ");


                    if (pullupOrpulldown == 0) //pullup
                    {
                        //adcv = (adcvMax * resv / (resv + pullres));
                        lines.Add(" #define Res_m  " + numericUpDown8.Value.ToString() + "UL");
                        lines.Add(" #define AD_VALUE(ntc_x) " + adcvMax.ToString() + "UL" + "* ntc_x /" + "(" +" Res_m "+"+ ntc_x)");
                
                    }
                    else//pulldown
                    {
                        // adcv = ((adcvMax * pullres) / (resv + pullres));
                        //lines.Add(" #define AD_VALUE(ntc_x) (4095UL * Res_pull / (Res_pull + ntc_x))");
                        lines.Add(" #define Res_m  " + numericUpDown8.Value.ToString() + "UL");
                        lines.Add(" #define AD_VALUE(ntc_x) " + adcvMax.ToString() + "UL" + "* Res_m /" + "(" + " Res_m " + "+ ntc_x)"); 
                    }

                    lines.Add("unsigned short const code g_temp_res_val[] ={");

                    int j = 0;
                    for (int i= startT;i< endT; i++)
                    {
                        j ++;
                       // lines.Add("AD_VALUE" + "(" + (NtcCalc_GetResByTemp(((double)numericUpDown1.Value), ((double)numericUpDown2.Value), ((double)i), ((double)numericUpDown4.Value))).ToString() + ")" + "//"+(i >= 0 ? i.ToString() : ("N" + (-i).ToString()))+ "℃");
                       // lines.Add("#define NtcResVal_at" + (i >= 0 ? i.ToString() : ("N" + (-i).ToString())) + " " + (NtcCalc_GetResByTemp(((double)numericUpDown1.Value), ((double)numericUpDown2.Value), ((double)i), ((double)numericUpDown4.Value)) / 1000).ToString("F3"));

                        resv = NtcCalc_GetResByTemp(((double)numericUpDown1.Value), ((double)numericUpDown2.Value), ((double)i), ((double)numericUpDown4.Value));
                        if (pullupOrpulldown == 0) //pullup
                        {
                            adcv = (adcvMax * resv / (resv + pullres));
                        }
                        else//pulldown
                        {
                            adcv = ((adcvMax * pullres) / (resv + pullres));
                        }
                        //lines.Add("#define NtcAdcVal_at" + (i >= 0 ? i.ToString() : ("N" + (-i).ToString())) + " " + ((int)adcv).ToString());
                        lines.Add("AD_VALUE" + "(" + (NtcCalc_GetResByTemp(((double)numericUpDown1.Value), ((double)numericUpDown2.Value), ((double)i), ((double)numericUpDown4.Value))).ToString() + ")" + "," + "//" + (i >= 0 ? i.ToString() : ("-" + (-i).ToString())) + "℃"
                            +  (" index= " + (j).ToString()) + "  ADC= " + ((int)adcv).ToString() );

                    }
                    lines.Add("};");

                    lines.Add("#endif");
                    lines.Add("");
                    File.WriteAllLines(sfd.FileName, lines.ToArray());

                }

                if (sfdc.ShowDialog() == DialogResult.OK)
                {
                    if (sfdc.FileName.Length > 0)
                    {
                        List<String> clines = new List<string>();
                        clines.Add("");
                        clines.Add("#include <" + sfd.FileName.ToString() + ".h>");
                        File.WriteAllLines(sfdc.FileName, clines.ToArray());
                    }

                }

                else return;
            }
        }


        //private void SaveItemsToFile_Adc_H(string filename, int pullupOrpulldown, double pullres, int adcvMax, int startT, int endT)
        //{
        //    SaveFileDialog sfd = new SaveFileDialog();
        //    sfd.Title = "导出NTC温度传感器ADC分度表";
        //    sfd.Filter = "C头文件(*.h)|*.h";
        //    sfd.FileName = filename;

        //    if (sfd.ShowDialog() != DialogResult.OK || string.IsNullOrEmpty(sfd.FileName))
        //        return;

        //    // 1. 计算所有温度点的ADC值
        //    List<int> adcValues = new List<int>();
        //    for (int temp = startT; temp <= endT; temp++)
        //    {
        //        double resv = NtcCalc_GetResByTemp(
        //            (double)numericUpDown1.Value,
        //            (double)numericUpDown2.Value,
        //            temp,
        //            (double)numericUpDown4.Value
        //        );

        //        double adcv;
        //        if (pullupOrpulldown == 0)
        //        {
        //            // 上拉模式
        //            adcv = adcvMax * resv / (resv + pullres);
        //        }
        //        else
        //        {
        //            // 下拉模式
        //            adcv = adcvMax * pullres / (resv + pullres);
        //        }

        //        adcValues.Add((int)Math.Round(adcv));
        //    }

        //    // 检查adcValues是否为空
        //    if (adcValues.Count == 0)
        //    {
        //        MessageBox.Show("无法生成分度表，请检查输入参数是否正确！", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //        return;
        //    }

        //    string headerPath = sfd.FileName.EndsWith(".h", StringComparison.OrdinalIgnoreCase)
        //        ? sfd.FileName
        //        : Path.ChangeExtension(sfd.FileName, ".h");

        //    string cFilePath = Path.ChangeExtension(headerPath, ".c");
        //    string baseName = Path.GetFileNameWithoutExtension(headerPath).ToUpper();

        //    // 2. 生成.h头文件 (接口声明)
        //    GenerateHeaderFile(headerPath, baseName, adcValues.Count, adcvMax, pullupOrpulldown, pullres, startT, endT);

        //    // 3. 生成.c源文件 (具体实现)
        //    GenerateSourceFile(cFilePath, baseName, adcValues, startT, endT);

        //    // 4. 显示生成结果
        //    string message = string.Format("成功生成NTC分度表：\n头文件: {0}\n源文件: {1}",
        //        Path.GetFileName(headerPath),
        //        Path.GetFileName(cFilePath));

        //    MessageBox.Show(message, "导出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
        //}

        //// 生成C头文件(.h)
        //private void GenerateHeaderFile(string path, string baseName, int count, int adcvMax, int mode, double pullres, int startT, int endT)
        //{
        //    List<string> lines = new List<string>();
        //    string arrayType = GetAdcDataType(adcvMax); // 智能选择数据类型 

        //    // 清理baseName中的非法字符 
        //    string cleanBaseName = CleanForMacro(baseName);

        //    lines.Add(string.Format("#ifndef __{0}_H_", cleanBaseName));
        //    lines.Add(string.Format("#define __{0}_H_", cleanBaseName));
        //    lines.Add("");
        //    lines.Add("/* NTC温度传感器配置参数 */");
        //    lines.Add(string.Format("// 工作模式: {0}", mode == 0 ? "上拉电阻" : "下拉电阻"));
        //    lines.Add(string.Format("// 参考电阻: {0} Ω", pullres));
        //    lines.Add(string.Format("// ADC量程: 0-{0}", adcvMax));
        //    lines.Add(string.Format("// 温度范围: {0}℃ 到 {1}℃", startT, endT));
        //    lines.Add(string.Format("// 分度表长度: {0}个点", count));
        //    lines.Add("");
        //    lines.Add(string.Format("extern const {0} NTC_ADC_TABLE[{1}];", arrayType, count));
        //    lines.Add("");
        //    lines.Add("// 温度索引转换函数");
        //    lines.Add("int NTC_GetTemperature(int adcValue);");
        //    lines.Add("");
        //    lines.Add("#endif");

        //    File.WriteAllLines(path, lines.ToArray());
        //}




        //// 生成C源文件(.c) - 关键修复 
        //private void GenerateSourceFile(string path, string baseName, List<int> adcValues, int startT, int endT)
        //{
        //    List<string> lines = new List<string>();
        //    string headerName = baseName + ".h";  // 直接使用基本名称 + .h 

        //    lines.Add(string.Format("#include \"{0}\"", headerName));
        //    lines.Add("#include <stdint.h>");
        //    lines.Add("");
        //    lines.Add("/* NTC温度传感器ADC分度表 */");
        //    lines.Add(string.Format("// 自动生成时间: {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm")));

        //    // 获取合适的数据类型 
        //    int maxValue = adcValues.Max();
        //    string dataType = GetAdcDataType(maxValue);
        //    lines.Add(string.Format("const {0} NTC_ADC_TABLE[] = ", dataType));
        //    lines.Add("{");

        //    // 格式化数组输出 (每行10个值) - 修复格式问题 
        //    int totalValues = adcValues.Count;
        //    StringBuilder currentLine = new StringBuilder("    ");

        //    for (int i = 0; i < totalValues; i++)
        //    {
        //        currentLine.Append(adcValues[i]);

        //        // 添加逗号（除非是最后一个元素）
        //        if (i < totalValues - 1)
        //        {
        //            currentLine.Append(", ");
        //        }

        //        // 每10个值换行 
        //        if ((i + 1) % 10 == 0 && i < totalValues - 1)
        //        {
        //            lines.Add(currentLine.ToString());
        //            currentLine = new StringBuilder("    ");
        //        }
        //    }

        //    // 添加最后一行
        //    if (currentLine.Length > 0)
        //    {
        //        lines.Add(currentLine.ToString());
        //    }

        //    lines.Add("};");
        //    lines.Add("");
        //    lines.Add("/* 温度查询函数 */");
        //    lines.Add("int NTC_GetTemperature(int adcValue)");
        //    lines.Add("{");
        //    lines.Add("    // 二分查找实现");
        //    lines.Add(string.Format("    int low = 0;"));
        //    lines.Add(string.Format("    int high = {0};", adcValues.Count - 1));
        //    lines.Add(string.Format("    int baseTemp = {0}; // 起始温度", startT));
        //    lines.Add("");
        //    lines.Add("    while (low <= high) {");
        //    lines.Add("        int mid = low + (high - low) / 2;");
        //    lines.Add("        if (NTC_ADC_TABLE[mid] == adcValue) {");
        //    lines.Add("            return baseTemp + mid; // 精确匹配");
        //    lines.Add("        }");
        //    lines.Add("        if (NTC_ADC_TABLE[mid] < adcValue) {");
        //    lines.Add("            high = mid - 1;");
        //    lines.Add("        } else {");
        //    lines.Add("            low = mid + 1;");
        //    lines.Add("        }");
        //    lines.Add("    }");
        //    lines.Add("");
        //    lines.Add("    // 线性插值计算 (当未精确匹配时)");
        //    lines.Add("    if (low > 0 && low < sizeof(NTC_ADC_TABLE)/sizeof(NTC_ADC_TABLE[0])) {");
        //    lines.Add("        int adcLow = NTC_ADC_TABLE[low];");
        //    lines.Add("        int adcHigh = NTC_ADC_TABLE[low - 1];");
        //    lines.Add("        float ratio = (float)(adcValue - adcLow) / (adcHigh - adcLow);");
        //    lines.Add("        return baseTemp + low - ratio; // 返回插值温度");
        //    lines.Add("    }");
        //    lines.Add("");
        //    lines.Add("    return baseTemp + low; // 边界处理");
        //    lines.Add("}");

        //    File.WriteAllLines(path, lines.ToArray());
        //}


        // 修正参数传递 - 完整代码实现 
        private void SaveItemsToFile_Adc_H(string filename, int pullupOrpulldown, double pullres, int adcvMax, int startT, int endT)
        {
            SaveFileDialog sfd = new
         SaveFileDialog();
            sfd.Title = "导出NTC温度传感器ADC分度表"
        ;
            sfd.Filter = "C头文件(*.h)|*.h"
        ;
            sfd.FileName = filename;

            if (sfd.ShowDialog() != DialogResult.OK || string
        .IsNullOrEmpty(sfd.FileName))
                return
        ;

            // 1. 计算所有温度点的ADC值和电阻值 
            List<int> adcValues = new List<int
        >();
            List<double> resValues = new List<double
        >();

            for (int
         temp = startT; temp <= endT; temp++)
            {
                double
         resv = NtcCalc_GetResByTemp(
                    (double
        )numericUpDown1.Value,
                    (double
        )numericUpDown2.Value,
                    temp,
                    (double
        )numericUpDown4.Value
                );

                resValues.Add(resv);

                double
         adcv;
                if (pullupOrpulldown == 0
        )
                {
                    adcv = adcvMax * resv / (resv + pullres);
                }
                else
                {
                    adcv = adcvMax * pullres / (resv + pullres);
                }

                adcValues.Add((int
        )Math.Round(adcv));
            }

            if (adcValues.Count == 0
        )
            {
                MessageBox.Show("无法生成分度表，请检查输入参数是否正确！", "错误"
        , MessageBoxButtons.OK, MessageBoxIcon.Error);
                return
        ;
            }

            string headerPath = Path.ChangeExtension(sfd.FileName, ".h"
        );
            string cFilePath = Path.ChangeExtension(sfd.FileName, ".c"
        );
            string
         baseName = Path.GetFileNameWithoutExtension(headerPath).ToUpper();

            // 2. 生成.h头文件（传递正确参数）
            GenerateHeaderFile(headerPath, baseName, adcValues.Count, adcvMax, pullupOrpulldown, pullres, startT, endT);

            // 3. 生成.c源文件（传递正确参数）
            GenerateSourceFile(cFilePath, baseName, adcValues, resValues, startT, endT, pullupOrpulldown, adcvMax);

            // 4. 显示结果
            string message = $"成功生成NTC分度表：\n头文件: {Path.GetFileName(headerPath)}\n源文件: {Path.GetFileName(cFilePath)}"
        ;
            MessageBox.Show(message, "导出完成"
        , MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        //private void SaveItemsToFile_Adc_H(string filename, int pullupOrpulldown, double pullres, int adcvMax, int startT, int endT)
        //{
        //    SaveFileDialog sfd = new SaveFileDialog();
        //    sfd.Title = "导出NTC温度传感器ADC分度表";
        //    sfd.Filter = "C头文件(*.h)|*.h";
        //    sfd.FileName = filename;

        //    if (sfd.ShowDialog() != DialogResult.OK || string.IsNullOrEmpty(sfd.FileName))
        //        return;

        //    // 1. 计算所有温度点的ADC值和电阻值 
        //    List<int> adcValues = new List<int>();
        //    List<double> resValues = new List<double>(); // 新增：存储电阻值 

        //    for (int temp = startT; temp <= endT; temp++)
        //    {
        //        // 计算当前温度下的电阻值 
        //        double resv = NtcCalc_GetResByTemp(
        //            (double)numericUpDown1.Value,
        //            (double)numericUpDown2.Value,
        //            temp,
        //            (double)numericUpDown4.Value
        //        );

        //        resValues.Add(resv); // 存储电阻值 

        //        // 计算ADC值 
        //        double adcv;
        //        if (pullupOrpulldown == 0)
        //        {
        //            adcv = adcvMax * resv / (resv + pullres); // 上拉模式 
        //        }
        //        else
        //        {
        //            adcv = adcvMax * pullres / (resv + pullres); // 下拉模式 
        //        }

        //        adcValues.Add((int)Math.Round(adcv));
        //    }

        //    if (adcValues.Count == 0)
        //    {
        //        MessageBox.Show("无法生成分度表，请检查输入参数是否正确！", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
        //        return;
        //    }

        //    string headerPath = sfd.FileName.EndsWith(".h", StringComparison.OrdinalIgnoreCase)
        //        ? sfd.FileName
        //        : Path.ChangeExtension(sfd.FileName, ".h");

        //    string cFilePath = Path.ChangeExtension(headerPath, ".c");
        //    string baseName = Path.GetFileNameWithoutExtension(headerPath).ToUpper();

        //    // 2. 生成.h头文件 
        //    GenerateHeaderFile(headerPath, baseName, adcValues.Count, adcvMax, pullupOrpulldown, pullres, startT, endT);

        //    // 3. 生成.c源文件（新增电阻值参数）
        //    GenerateSourceFile(cFilePath, baseName, adcValues, resValues, startT, endT);

        //    // 4. 显示结果 
        //    string message = $"成功生成NTC分度表：\n头文件: {Path.GetFileName(headerPath)}\n源文件: {Path.GetFileName(cFilePath)}";
        //    MessageBox.Show(message, "导出完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
        //}

        private void GenerateSourceFile(string path, string baseName, List<int> adcValues, List<double> resValues, int startT, int endT, int pullupOrpulldown, int adcvMax)
        {
            List<string> lines = new List<string>();
            string headerName = baseName + ".h";

            lines.Add($"#include \"{headerName}\"");
            lines.Add("#include <stdint.h>");
            lines.Add("");
            lines.Add("/* NTC温度传感器ADC分度表 */");
            lines.Add($"// 自动生成时间: {DateTime.Now:yyyy-MM-dd HH:mm}");
            lines.Add($"// 短路/断路检测阈值 = {adcvMax * 0.03} (3%量程)"); // 新增短路断路说明 

            int maxValue = adcValues.Max();
            string dataType = GetAdcDataType(maxValue);
            lines.Add($"const {dataType} NTC_ADC_TABLE[] = ");
            lines.Add("{");

            int totalValues = adcValues.Count;
            for (int i = 0; i < totalValues; i++)
            {
                int currentTemp = startT + i;
                int resVal = (int)Math.Round(resValues[i]);

                string dataLine = $"    {adcValues[i]}";
                if (i < totalValues - 1) dataLine += ",";

                string comment = $" // {currentTemp}℃ index={i} res_val={resVal}R";
                lines.Add($"{dataLine.PadRight(15)}{comment}");
            }

            lines.Add("};");
            lines.Add("");
            lines.Add("/* 温度查询函数（新增短路/断路检测） */");
            lines.Add("int NTC_GetTemperature(int adcValue)");
            lines.Add("{");

            // ============= 新增短路/断路检测 =============
            lines.Add("    // 1. 短路/断路故障检测");
            lines.Add($"    const int FAULT_THRESHOLD = (int)(NTC_ADC_MAX * 0.03f); // 3%量程作为故障阈值");
            lines.Add("    ");
            lines.Add("    // 上拉模式检测逻辑");
            lines.Add("    if (NTC_MODE == 0) { // 上拉模式");
            lines.Add("        if (adcValue >= NTC_ADC_MAX - FAULT_THRESHOLD) {");
            lines.Add("            return NTC_SHORT_CIRCUIT_TEMP; // ADC接近最大值→短路");
            lines.Add("        }");
            lines.Add("        if (adcValue <= FAULT_THRESHOLD) {");
            lines.Add("            return NTC_OPEN_CIRCUIT_TEMP; // ADC接近最小值→断路");
            lines.Add("        }");
            lines.Add("    }");
            lines.Add("    // 下拉模式检测逻辑");
            lines.Add("    else { // 下拉模式");
            lines.Add("        if (adcValue <= FAULT_THRESHOLD) {");
            lines.Add("            return NTC_SHORT_CIRCUIT_TEMP; // ADC接近最小值→短路");
            lines.Add("        }");
            lines.Add("        if (adcValue >= NTC_ADC_MAX - FAULT_THRESHOLD) {");
            lines.Add("            return NTC_OPEN_CIRCUIT_TEMP; // ADC接近最大值→断路");
            lines.Add("        }");
            lines.Add("    }");
            lines.Add("    ");
            // ============= 原有温度计算逻辑 =============
            lines.Add("    // 2. 正常温度范围计算");
            lines.Add("    int low = 0;");
            lines.Add($"    int high = {adcValues.Count - 1};");
            lines.Add($"    int baseTemp = {startT}; // 起始温度");
            lines.Add("");
            lines.Add("    while (low <= high) {");
            lines.Add("        int mid = low + (high - low) / 2;");
            lines.Add("        if (NTC_ADC_TABLE[mid] == adcValue) {");
            lines.Add("            return baseTemp + mid; // 精确匹配");
            lines.Add("        }");
            lines.Add("        if (NTC_ADC_TABLE[mid] < adcValue) {");
            lines.Add("            high = mid - 1;");
            lines.Add("        } else {");
            lines.Add("            low = mid + 1;");
            lines.Add("        }");
            lines.Add("    }");
            lines.Add("");
            lines.Add("    // 3. 线性插值计算");
            lines.Add("    if (low > 0 && low < sizeof(NTC_ADC_TABLE)/sizeof(NTC_ADC_TABLE[0])) {");
            lines.Add("        int adcLow = NTC_ADC_TABLE[low];");
            lines.Add("        int adcHigh = NTC_ADC_TABLE[low - 1];");
            lines.Add("        float ratio = (float)(adcValue - adcLow) / (adcHigh - adcLow);");
            lines.Add("        return baseTemp + low - ratio; // 返回插值温度");
            lines.Add("    }");
            lines.Add("");
            lines.Add("    // 4. 边界处理");
            lines.Add("    return baseTemp + low;");
            lines.Add("}");

            File.WriteAllLines(path, lines.ToArray());
        }

        // ============= 修改头文件生成函数 =============
        private void GenerateHeaderFile(string path, string baseName, int count, int adcvMax, int mode, double pullres, int startT, int endT)
        {
            List<string> lines = new List<string>();
            string arrayType = GetAdcDataType(adcvMax);
            string cleanBaseName = CleanForMacro(baseName);

            lines.Add($"#ifndef __{cleanBaseName}_H_");
            lines.Add($"#define __{cleanBaseName}_H_");
            lines.Add("");
            lines.Add("/* NTC温度传感器配置参数 */");
            lines.Add($"#define NTC_MODE ({mode}) // 0=上拉电阻, 1=下拉电阻");
            lines.Add($"#define NTC_ADC_MAX ({adcvMax}) // ADC量程最大值");
            lines.Add($"#define NTC_SHORT_CIRCUIT_TEMP (-1000) // 短路故障代码");
            lines.Add($"#define NTC_OPEN_CIRCUIT_TEMP (-2000) // 断路故障代码");
            lines.Add("");
            lines.Add($"// 参考电阻: {pullres} Ω");
            lines.Add($"// 温度范围: {startT}℃ 到 {endT}℃");
            lines.Add($"// 分度表长度: {count}个点");
            lines.Add("");
            lines.Add($"extern const {arrayType} NTC_ADC_TABLE[{count}];");
            lines.Add("");
            lines.Add("// 温度查询函数（含故障检测）");
            lines.Add("int NTC_GetTemperature(int adcValue);");
            lines.Add("");
            lines.Add("#endif");

            File.WriteAllLines(path, lines.ToArray());
        }


        //// 生成C头文件(.h) - 保持不变 
        //private void GenerateHeaderFile(string path, string baseName, int count, int adcvMax, int mode, double pullres, int startT, int endT)
        //{
        //    List<string> lines = new List<string>();
        //    string arrayType = GetAdcDataType(adcvMax);
        //    string cleanBaseName = CleanForMacro(baseName);

        //    lines.Add($"#ifndef __{cleanBaseName}_H_");
        //    lines.Add($"#define __{cleanBaseName}_H_");
        //    lines.Add("");
        //    lines.Add("/* NTC温度传感器配置参数 */");
        //    lines.Add($"// 工作模式: {(mode == 0 ? "上拉电阻" : "下拉电阻")}");
        //    lines.Add($"// 参考电阻: {pullres} Ω");
        //    lines.Add($"// ADC量程: 0-{adcvMax}");
        //    lines.Add($"// 温度范围: {startT}℃ 到 {endT}℃");
        //    lines.Add($"// 分度表长度: {count}个点");
        //    lines.Add("");
        //    lines.Add($"extern const {arrayType} NTC_ADC_TABLE[{count}];");
        //    lines.Add("");
        //    lines.Add("// 温度索引转换函数");
        //    lines.Add("int NTC_GetTemperature(int adcValue);");
        //    lines.Add("");
        //    lines.Add("#endif");

        //    File.WriteAllLines(path, lines.ToArray());
        //}

        //// 生成C源文件(.c) - 关键修改：添加电阻值注释 
        //private void GenerateSourceFile(string path, string baseName, List<int> adcValues, List<double> resValues, int startT, int endT)
        //{
        //    List<string> lines = new List<string>();
        //    string headerName = baseName + ".h";

        //    lines.Add($"#include \"{headerName}\"");
        //    lines.Add("#include <stdint.h>");
        //    lines.Add("");
        //    lines.Add("/* NTC温度传感器ADC分度表 */");
        //    lines.Add($"// 自动生成时间: {DateTime.Now.ToString("yyyy-MM-dd HH:mm")}");

        //    int maxValue = adcValues.Max();
        //    string dataType = GetAdcDataType(maxValue);
        //    lines.Add($"const {dataType} NTC_ADC_TABLE[] = ");
        //    lines.Add("{");

        //    int totalValues = adcValues.Count;
        //    for (int i = 0; i < totalValues; i++)
        //    {
        //        int currentTemp = startT + i;
        //        int resVal = (int)Math.Round(resValues[i]); // 电阻值取整 

        //        // 生成带温度注释的数据行 
        //        string dataLine = $"    {adcValues[i]}";
        //        if (i < totalValues - 1) dataLine += ",";

        //        // 添加详细注释（格式：温度+索引+电阻值）
        //        string comment = $" // {currentTemp}℃ index={i} res_val={resVal}R";
        //        lines.Add($"{dataLine.PadRight(15)}{comment}");
        //    }

        //    lines.Add("};");
        //    lines.Add("");
        //    lines.Add("/* 温度查询函数 */");
        //    lines.Add("int NTC_GetTemperature(int adcValue)");
        //    lines.Add("{");
        //    lines.Add("    // 二分查找实现");
        //    lines.Add($"    int low = 0;");
        //    lines.Add($"    int high = {adcValues.Count - 1};");
        //    lines.Add($"    int baseTemp = {startT}; // 起始温度");
        //    lines.Add("");
        //    lines.Add("    while (low <= high) {");
        //    lines.Add("        int mid = low + (high - low) / 2;");
        //    lines.Add("        if (NTC_ADC_TABLE[mid] == adcValue) {");
        //    lines.Add("            return baseTemp + mid; // 精确匹配");
        //    lines.Add("        }");
        //    lines.Add("        if (NTC_ADC_TABLE[mid] < adcValue) {");
        //    lines.Add("            high = mid - 1;");
        //    lines.Add("        } else {");
        //    lines.Add("            low = mid + 1;");
        //    lines.Add("        }");
        //    lines.Add("    }");
        //    lines.Add("");
        //    lines.Add("    // 线性插值计算 (当未精确匹配时)");
        //    lines.Add("    if (low > 0 && low < sizeof(NTC_ADC_TABLE)/sizeof(NTC_ADC_TABLE[0])) {");
        //    lines.Add("        int adcLow = NTC_ADC_TABLE[low];");
        //    lines.Add("        int adcHigh = NTC_ADC_TABLE[low - 1];");
        //    lines.Add("        float ratio = (float)(adcValue - adcLow) / (adcHigh - adcLow);");
        //    lines.Add("        return baseTemp + low - ratio; // 返回插值温度");
        //    lines.Add("    }");
        //    lines.Add("");
        //    lines.Add("    return baseTemp + low; // 边界处理");
        //    lines.Add("}");

        //    File.WriteAllLines(path, lines.ToArray());
        //}

        //// 辅助函数：获取ADC数据类型（示例实现）
        //private string GetAdcDataType(int maxValue)
        //{
        //    if (maxValue <= 255) return "uint8_t";
        //    if (maxValue <= 65535) return "uint16_t";
        //    return "uint32_t";
        //}

        //// 辅助函数：清理宏定义非法字符（示例实现）
        //private string CleanForMacro(string input)
        //{
        //    return input.Replace(" ", "_")
        //                .Replace("-", "_")
        //                .Replace(".", "_");
        //}

        // 清理字符串用于宏定义 
        private string CleanForMacro(string input)
        {
            StringBuilder sb = new StringBuilder();
            foreach (char c in input)
            {
                if (char.IsLetterOrDigit(c))
                {
                    sb.Append(c);
                }
                else
                {
                    sb.Append('_');
                }
            }
            return sb.ToString();
        }

        // 根据ADC范围选择合适的数据类型
        private string GetAdcDataType(int maxValue)
        {
            if (maxValue > 65535)
            {
                return "uint32_t";
            }
            else if (maxValue > 255)
            {
                return "uint16_t";
            }
            else
            {
                return "uint8_t";
            }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            string resK = (((int)numericUpDown2.Value) / 10).ToString()+"_"+ ((int)numericUpDown4.Value)+"C";
            string resB = (((int)numericUpDown1.Value)).ToString();

            string pathstr = "NTC_" + resK + "_B" + resB + "_ADC.h";
            //"d:\\NTC_"+ resK + "K_B"+ resB+".h"
            SaveItemsToFile_Res_H(Path.GetFileNameWithoutExtension(pathstr), ((int)numericUpDown7.Value), ((int)numericUpDown6.Value));
            
        }

        private void button4_Click(object sender, EventArgs e)
        {
            string resK = (((int)numericUpDown2.Value) / 10).ToString() + "K_" + ((int)numericUpDown4.Value) + "C";
            string resB = (((int)numericUpDown1.Value)).ToString();

            string pathstr = "NTC_" + resK + "_B" + resB + "_ADC.h";
            //"d:\\NTC_"+ resK + "K_B"+ resB+".h"
            SaveItemsToFile_Adc_H(Path.GetFileNameWithoutExtension(pathstr), comboBox1.SelectedIndex, ((double)numericUpDown8.Value), ((int)numericUpDown9.Value), ((int)numericUpDown7.Value), ((int)numericUpDown6.Value));
        }

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            System.Diagnostics.Process.Start("https://gitee.com/brand_zhou");
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}


